package com.lyncs.ods.modules.company.service;

import com.lyncs.ods.common.api.CommonPage;
import com.lyncs.ods.req.*;
import com.lyncs.ods.resp.*;
import me.chanjar.weixin.common.error.WxErrorException;

import java.util.List;
import java.util.Map;

/**
 * @author alex
 * @date 2022/4/04 14:05
 * @description
 */
public interface CompanyService {
    /**
     * 用户注册公司并关联
     *
     * @param req req
     * @return resp
     */
    UserCompanyResp registerCompany(SaveCompanyReq req);

    /**
     * create one company for Partner
     *
     * @param req request info
     * @return
     */
    Long savePartnerCompany(SavePartnerCompanyReq req);

    /**
     * list all partner companies (all available)
     *
     * @param type      Identity type: 1.supplier 2.Partner
     * @param page      page
     * @param pageSize  pageSize
     * @param companyId companyId
     * @return companies short info
     */
    CommonPage<PartnerInfoResp> listPartnerCompanies(Integer type, Integer page, Integer pageSize, Long companyId);

    /**
     * get staff info by company id
     *
     * @param companyId companyId
     * @return staffs
     */
    List<StaffInfoResp> listCompanyStaffs(Long companyId);

    /**
     * 获取收款信息
     *
     * @param companyId companyId
     * @return 收款信息
     */
    List<PaymentSettingResp> listPaymentInfo(Long companyId);

    /**
     * 保存款项配置
     *
     * @param req request info
     */
    void savePaymentInfo(CompanyPaymentEditReq req);

    /**
     * 获取企业配置款项信息
     *
     * @param companyId companyId
     * @return 款项信息
     */
    List<String> listCompanyFees(Long companyId);

    /**
     * 保存企业配置款项信息
     *
     * @param feeNames 配置款项信息
     */
    void saveCompanyFees(List<String> feeNames);

    /**
     * 启用/禁用 收款信息
     *
     * @param id     id
     * @param status status
     */
    void updatePaymentStatus(Long id, Integer status);

    /**
     * get company detail info by id
     *
     * @param companyId companyId
     * @param type      类型，默认company。company:A类企业;virtual:B类企业;partner:合作企业
     * @return detail info
     */
    CompanyDetailInfoResp getCompanyDetailInfo(Long companyId, String type);

    /**
     * 获取与公司关联的spu信息
     *
     * @param companyId companyId
     * @param page      page
     * @param pageSize  pageSize
     * @return 与公司关联的spu信息
     */
    CommonPage<SpuInfoResp> listCompanySpu(String companyId, Integer page, Integer pageSize);

    /**
     * 关联/解绑 spu
     *
     * @param companyId companyId
     * @param spuId     spuId
     * @param type      操作类型：1.关联;2.解绑
     */
    void saveCompanySpu(Long companyId, Long spuId, Integer type);

    /**
     * 企业与用户接触关联
     *
     * @param companyId companyId
     * @param userId    userId
     */
    void deleteStaff(Long companyId, Long userId);

    /**
     * 更新用户所属角色
     *
     * @param companyId companyId
     * @param userId    userId
     * @param role      role
     */
    void updateRole(Long companyId, Long userId, Integer role);

    /**
     * release partner relation
     *
     * @param companyId companyId
     * @param type      type
     */
    void releaseContact(Long companyId, Integer type);

    /**
     * 修改企业信息
     *
     * @param companyId cid
     * @param req       request info
     */
    void updateCompany(Long companyId, SaveCompanyReq req);

    /**
     * save company staffs by company/user id
     *
     * @param companyId companyId
     * @param req       request info
     */
    void saveStaffBatch(Long companyId, SaveStaffReq req);

    /**
     * 企业邀请建立关联关系
     *
     * @param req request info
     */
    void relateContact(PartnerRelationReq req);

    /**
     * 获取已建立的关系
     *
     * @param companyId  companyId
     * @param relationId relationId
     * @return 多个关系用逗号分隔
     */
    String getPartnerType(Long companyId, Long relationId);

    /**
     * 员工扫码授权加入
     *
     * @param appId
     * @param companyId companyId
     * @param code      code
     */
    void staffJoin(String appId, Long companyId, String code) throws WxErrorException;

    /**
     * 按关系类型统计
     *
     * @return
     */
    Map<Integer, Long> partnerCount();

    void saveRoleGroup(SaveCompanyRoleGroupReq req);

    CommonPage<CompanyRoleGroupResp> listRoleGroup(Integer page, Integer pageSize, Boolean includeCompanyInfo);

    void saveStaffGroup(Long companyId, SaveStaffGroupReq req);

    StaffDetailInfoResp getStaffDetail(Long companyId, Long userId);

    void updateSeal(String seal);

    String getSeal(Long companyId);

    TransactionInfoResp getTransactionInfo(Long companyId);
}
